CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s ApplyUpdates !!!!!

Otázka od: Ondřej Kaláb

30. 10. 2002 7:40

         ApplyUpdates !!!!!
Zdravim všechny,

Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.

Mam takovy problem. Mam aplikaci pro editovani dat v databazi. Cele to
funguje tak, ze klient pracuje s daty v ClientDatasetech (je jich vic -
v Master-Detail vztazích - takto tam jsou 3). Tyto ClientDatasety
ziskavaji sva data z ADOQuery - každý ze sve pomoci DataSetProvider.


Vsechno se mo nacte, data v datasetech si upravuju v pohode. Potiz
prijde pro ClientDataSet.ApplyUpdates, kdy mi to nahlasi chybu bud
"record not found or changed by another user" nebo "no key
specified"...
Tyto chyby nastanou pouze když byl zaznam smazan nebo
upraven. Pokud byl pridan novy zaznam, vse provehne OK.


Dluzno dodat, ze pokud mnepouzivam clientDatasety a data vkladam primo
do ADOQuery pomoci data-aware prvku, vsechno je OK. (dokonce funguje i
vkladani obrazku).

V helpu jsem si nasel, ze se da v DatasetProvide.BeforeUpdateData
definovat explicitne, která pole budou urcovat specificky zaznam a která
budou updatovatelna. Ale netusim jak to udelat. Jinak je moznost v
DatasetProvider.UpdateMode taktez specifikovat urcujici pole.

Zajimalo by me, jestli není třeba v datasetech nejak definovat index,
který je prim. Klicem v ADO tabulce, ze které dotaz bere data tak, aby
slo podle nej zaznam spokehlive urcit, ale zase když mam ty
clientDatasety v Master-Detail vztahu, jsou tam uz nadefinovany indexy
pro propojovane sloupce a ne pro primarni indexy tabulek.


Diky kazdemu za každý napad,

Ondřej Kaláb, DiS, Jihlava.


---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002

Odpovedá: delfi

30. 10. 2002 9:37

         ApplyUpdates !!!!!
HI,
pouzivam to takto a bez problemu:

procedure TmzdyServer00.dsp_PracovnikBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
begin
 with DM do
  begin
   // qPrac
   // naplneni id_CPrac, pri nove vete
    if (UpdateKind=ukInsert) and (SourceDS=qPrac) and
       (deltaDS.FieldByName('id_CPrac').NewValue < 0) then
       begin
        spPracnew.execProc;
        id_CPrac:=spPracnew.ParamByName('NextID').AsInteger;
        deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
       end;

   // zapis vety
   if (SourceDS=qPrac) then
    begin
     SetUSQLParams(UpdSQLPrac.Query[Updatekind], DeltaDS);
     UpdSQLPrac.ExecSQL(UpdateKind);
     Applied:=true;
    end;

   // qPracDeti
   // naplneni id_CPrac, pri nove vete
    if (UpdateKind=ukInsert) and (SourceDS=qPracDeti) and
       (deltaDS.FieldByName('id_CPrac').NewValue < 0) then
       begin
        deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
       end;
  atd

procedure TmzdyServer00.SetUSQLParams(AQuery: TQuery;
  ACDS: TClientDataset);
var
  i: integer;
  Old: Boolean;
  Param: TParam;
  PName: string;
  Field: TField;
  Value: Variant;
begin
  with AQuery do
  begin
    for I := 0 to Params.Count - 1 do
    begin
      Param := Params[I];
      PName := Param.Name;
      Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
      if Old then System.Delete(PName, 1, 4);
      Field := ACDS.FindField(PName);
      if not Assigned(Field) then Continue;
      if Old then Param.AssignFieldValue(Field, Field.OldValue) else
      begin
        Value := Field.NewValue;
        if VarIsEmpty(Value) then Value := Field.OldValue;
        Param.AssignFieldValue(Field, Value);
      end;
    end;
  end;
end;

Je to pro BDE, ale upravit pro ADobude malickost
ales


----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s
ApplyUpdates !!!!!


Zdravim všechny,

Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.



---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.406 / Virová báze: 229 - datum vydání: 21.10.2002

Odpovedá: Ondřej Kaláb

30. 10. 2002 10:37

         ApplyUpdates !!!!!
No, me ale pridavani zaznamu nejak zda se funguje. Co mi nefunguje je
mazani a modifikace. Pak to hlasi record not found... . A navíc u te
Query nepouzivam zadne parametry. Je to jen cisty dotaz do jedne tabulky
s definovanou podminkou. O te udalosti BeforeUpdataRecord jem uz taky
cetl. Tam bych nejka asi musel najit ten zaznam, který nemuze sam
ClientDataset najit podle id, ale nevim jak toho docilit....

-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of delfi
Sent: Wednesday, October 30, 2002 8:58 AM
To: delphi-l@clexpert.cz
Subject: Re: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 -
potíž s ApplyUpdates !!!!!


HI,
pouzivam to takto a bez problemu:

procedure TmzdyServer00.dsp_PracovnikBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
begin
 with DM do
  begin
   // qPrac
   // naplneni id_CPrac, pri nove vete
    if (UpdateKind=ukInsert) and (SourceDS=qPrac) and
       (deltaDS.FieldByName('id_CPrac').NewValue < 0) then
       begin
        spPracnew.execProc;
        id_CPrac:=spPracnew.ParamByName('NextID').AsInteger;
        deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
       end;

   // zapis vety
   if (SourceDS=qPrac) then
    begin
     SetUSQLParams(UpdSQLPrac.Query[Updatekind], DeltaDS);
     UpdSQLPrac.ExecSQL(UpdateKind);
     Applied:=true;
    end;

   // qPracDeti
   // naplneni id_CPrac, pri nove vete
    if (UpdateKind=ukInsert) and (SourceDS=qPracDeti) and
       (deltaDS.FieldByName('id_CPrac').NewValue < 0) then
       begin
        deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
       end;
  atd

procedure TmzdyServer00.SetUSQLParams(AQuery: TQuery;
  ACDS: TClientDataset);
var
  i: integer;
  Old: Boolean;
  Param: TParam;
  PName: string;
  Field: TField;
  Value: Variant;
begin
  with AQuery do
  begin
    for I := 0 to Params.Count - 1 do
    begin
      Param := Params[I];
      PName := Param.Name;
      Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
      if Old then System.Delete(PName, 1, 4);
      Field := ACDS.FindField(PName);
      if not Assigned(Field) then Continue;
      if Old then Param.AssignFieldValue(Field, Field.OldValue) else
      begin
        Value := Field.NewValue;
        if VarIsEmpty(Value) then Value := Field.OldValue;
        Param.AssignFieldValue(Field, Value);
      end;
    end;
  end;
end;

Je to pro BDE, ale upravit pro ADobude malickost
ales


----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž
s ApplyUpdates !!!!!


Zdravim všechny,

Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.



---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.406 / Virová báze: 229 - datum vydání: 21.10.2002

---
Příchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002
 

---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002

Odpovedá: hlas

30. 10. 2002 11:32

         ApplyUpdates !!!!!
mam uplne ten isty problem s TSimpleDataSet a DBX.
tiez nie som schopny ulozit zaznam do databazy metodou
applyupdates, ak iny uzivatel medzitym, tento zaznam upravil.



----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s
ApplyUpdates !!!!!


Zdravim všechny,

Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.

Mam takovy problem. Mam aplikaci pro editovani dat v databazi. Cele to
funguje tak, ze klient pracuje s daty v ClientDatasetech (je jich vic -
v Master-Detail vztazích - takto tam jsou 3). Tyto ClientDatasety
ziskavaji sva data z ADOQuery - každý ze sve pomoci DataSetProvider.


Vsechno se mo nacte, data v datasetech si upravuju v pohode. Potiz
prijde pro ClientDataSet.ApplyUpdates, kdy mi to nahlasi chybu bud
"record not found or changed by another user" nebo "no key
specified"...
Tyto chyby nastanou pouze když byl zaznam smazan nebo
upraven. Pokud byl pridan novy zaznam, vse provehne OK.


Dluzno dodat, ze pokud mnepouzivam clientDatasety a data vkladam primo
do ADOQuery pomoci data-aware prvku, vsechno je OK. (dokonce funguje i
vkladani obrazku).

V helpu jsem si nasel, ze se da v DatasetProvide.BeforeUpdateData
definovat explicitne, která pole budou urcovat specificky zaznam a která
budou updatovatelna. Ale netusim jak to udelat. Jinak je moznost v
DatasetProvider.UpdateMode taktez specifikovat urcujici pole.

Zajimalo by me, jestli není třeba v datasetech nejak definovat index,
který je prim. Klicem v ADO tabulce, ze které dotaz bere data tak, aby
slo podle nej zaznam spokehlive urcit, ale zase když mam ty
clientDatasety v Master-Detail vztahu, jsou tam uz nadefinovany indexy
pro propojovane sloupce a ne pro primarni indexy tabulek.


Diky kazdemu za každý napad,

Ondřej Kaláb, DiS, Jihlava.


---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002